﻿namespace Busconeitor.BusinessLayer.Kernel
{
    using Utils;
    using Domain.Entities;
    using Domain.Utils.SimpleList;
    using System.util;

    public class SearchEngine
    {
        #region Atributos
        
        // Es el minimo peso esperado de un documento para poder ser procesado por el motor de busqueda.
        public static double MinAceptableValue = 0; 
        
        #endregion

        #region Constructores

        #endregion

        #region Propiedades

        #endregion

        #region Metodos

        public static SearchResults Search(string query)
        {
            // buscamos los resultados mandando una lista con terminos limpios y un string con la query original
            var list = ProcessQuery(query);
            var result = new SearchResults(list, query);
            // aplica el modelo vectorial para calcular la relevancia o peso de los documentos encontrados
            result.ComputeVectorialModel();
            result.Complete();

            return result;
        }

        public static SimpleList ProcessQuery(string query)
        {
            var strTokenizer = new StringTokenizer(query);
            var listTerms = new SimpleList();            
            
            //Armo una lista con las palabras de la query en forma limpias
            while (strTokenizer.HasMoreTokens())
            {
                var term = WordCleaner.CleanWord(strTokenizer.NextToken());

                if (term.Length >= TerminoEntity.MinWordLength && !StopWords.EsStopWord(term))
                {
                    listTerms.AddLast(term);
                }
            }

            return listTerms;
        }

        #endregion
    }
}
